--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
sbapp/kivymd/uix/menu/menu.py b4f0ff722e954d1edc2d4d433f4bd95d362bcc3a (b4f0ff72) Text, 32.97 KB
T8b949e"""
Components/Menu
===============
.. seealso::
`Material Design spec, Menus <https://material.io/components/menus>`_
.. rubric:: Menus display a list of choices on temporary surfaces.
.. image:: https://github.com/HeaTTheatR/KivyMD-data/raw/master/gallery/kivymddoc/menu-previous.png
:align: center
Usage
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
.. code-block:: python
from kivy.lang import Builder
from kivymd.app import MDApp
from kivymd.uix.menu import MDDropdownMenu
KV = '''
MDScreen:
MDRaisedButton:
id: button
text: "PRESS ME"
pos_hint: {"center_x": .5, "center_y": .5}
on_release: app.menu.open()
'''
class Test(MDApp):
def __init__(self, **kwargs):
super().__init__(**kwargs)
self.screen = Builder.load_string(KV)
menu_items = [
{
"text": f"Item {i}",
"viewclass": "OneLineListItem",
"on_release": lambda x=f"Item {i}": self.menu_callback(x),
} for i in range(5)
]
self.menu = MDDropdownMenu(
caller=self.screen.ids.button,
items=menu_items,
width_mult=4,
)
def menu_callback(self, text_item):
print(text_item)
def build(self):
return self.screen
Test().run()
.. image:: https://github.com/HeaTTheatR/KivyMD-data/raw/master/gallery/kivymddoc/menu-usage.gif
:align: center
.. Warning:: Do not create the :class:`~MDDropdownMenu` object when you open
the menu window. Because on a mobile device this one will be very slow!
Wrong
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
.. code-block:: python
menu = MDDropdownMenu(caller=self.screen.ids.button, items=menu_items)
menu.open()
Customization of menu item
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Menu items are created in the same way as items for the
:class:`~kivy.uix.recycleview.RecycleView` class.
.. code-block:: python
from kivy.lang import Builder
from kivy.metrics import dp
from kivy.properties import StringProperty
from kivymd.app import MDApp
from kivymd.uix.boxlayout import MDBoxLayout
from kivymd.uix.list import IRightBodyTouch, OneLineAvatarIconListItem
from kivymd.uix.menu import MDDropdownMenu
KV = '''
<RightContentCls>
disabled: True
adaptive_size: True
pos_hint: {"center_y": .5}
MDIconButton:
icon: root.icon
user_font_size: "16sp"
md_bg_color_disabled: 0, 0, 0, 0
MDLabel:
text: root.text
font_style: "Caption"
adaptive_size: True
pos_hint: {"center_y": .5}
<Item>
IconLeftWidget:
icon: root.left_icon
RightContentCls:
id: container
icon: root.right_icon
text: root.right_text
MDScreen:
MDRaisedButton:
id: button
text: "PRESS ME"
pos_hint: {"center_x": .5, "center_y": .5}
on_release: app.menu.open()
'''
class RightContentCls(IRightBodyTouch, MDBoxLayout):
icon = StringProperty()
text = StringProperty()
class Item(OneLineAvatarIconListItem):
left_icon = StringProperty()
right_icon = StringProperty()
right_text = StringProperty()
class Test(MDApp):
def __init__(self, **kwargs):
super().__init__(**kwargs)
self.screen = Builder.load_string(KV)
menu_items = [
{
"text": f"Item {i}",
"right_text": f"R+{i}",
"right_icon": "apple-keyboard-command",
"left_icon": "git",
"viewclass": "Item",
"height": dp(54),
"on_release": lambda x=f"Item {i}": self.menu_callback(x),
} for i in range(5)
]
self.menu = MDDropdownMenu(
caller=self.screen.ids.button,
items=menu_items,
width_mult=4,
)
def menu_callback(self, text_item):
print(text_item)
def build(self):
return self.screen
Test().run()
.. image:: https://github.com/HeaTTheatR/KivyMD-data/raw/master/gallery/kivymddoc/menu-right.gif
:align: center
.. Header:
Header
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
.. code-block:: python
from kivy.lang import Builder
from kivy.metrics import dp
from kivymd.app import MDApp
from kivymd.uix.menu import MDDropdownMenu
from kivymd.uix.boxlayout import MDBoxLayout
KV = '''
<MenuHeader>
orientation: "vertical"
adaptive_size: True
padding: "4dp"
MDBoxLayout:
spacing: "12dp"
adaptive_size: True
MDIconButton:
icon: "gesture-tap-button"
pos_hint: {"center_y": .5}
MDLabel:
text: "Actions"
adaptive_size: True
pos_hint: {"center_y": .5}
MDScreen:
MDRaisedButton:
id: button
text: "PRESS ME"
pos_hint: {"center_x": .5, "center_y": .5}
on_release: app.menu.open()
'''
class MenuHeader(MDBoxLayout):
'''An instance of the class that will be added to the menu header.'''
class Test(MDApp):
def __init__(self, **kwargs):
super().__init__(**kwargs)
self.screen = Builder.load_string(KV)
menu_items = [
{
"text": f"Item {i}",
"viewclass": "OneLineListItem",
"height": dp(56),
"on_release": lambda x=f"Item {i}": self.menu_callback(x),
} for i in range(5)
]
self.menu = MDDropdownMenu(
header_cls=MenuHeader(),
caller=self.screen.ids.button,
items=menu_items,
width_mult=4,
)
def menu_callback(self, text_item):
print(text_item)
def build(self):
return self.screen
Test().run()
.. image:: https://github.com/HeaTTheatR/KivyMD-data/raw/master/gallery/kivymddoc/menu-header.png
:align: center
Menu with MDTopAppBar
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
The :class:`~MDDropdownMenu` works well with the standard
:class:`~kivymd.uix.toolbar.MDTopAppBar`. Since the buttons on the Toolbar are created
by the MDTopAppBar component, it is necessary to pass the button as an argument to
the callback using `lambda x: app.callback(x)`.
.. note:: This example uses drop down menus for both the righthand and
lefthand menus (i.e both the 'triple bar' and 'triple dot' menus) to
illustrate that it is possible. A better solution for the 'triple bar' menu
would probably have been :class:`~kivymd.uix.MDNavigationDrawer`.
.. code-block:: python
from kivy.lang import Builder
from kivy.metrics import dp
from kivymd.app import MDApp
from kivymd.uix.menu import MDDropdownMenu
from kivymd.uix.snackbar import Snackbar
KV = '''
MDBoxLayout:
orientation: "vertical"
MDTopAppBar:
title: "MDTopAppBar"
left_action_items: [["menu", lambda x: app.callback(x)]]
right_action_items: [["dots-vertical", lambda x: app.callback(x)]]
MDLabel:
text: "Content"
halign: "center"
'''
class Test(MDApp):
def build(self):
menu_items = [
{
"viewclass": "OneLineListItem",
"text": f"Item {i}",
"height": dp(56),
"on_release": lambda x=f"Item {i}": self.menu_callback(x),
} for i in range(5)
]
self.menu = MDDropdownMenu(
items=menu_items,
width_mult=4,
)
return Builder.load_string(KV)
def callback(self, button):
self.menu.caller = button
self.menu.open()
def menu_callback(self, text_item):
self.menu.dismiss()
Snackbar(text=text_item).open()
Test().run()
.. image:: https://github.com/HeaTTheatR/KivyMD-data/raw/master/gallery/kivymddoc/toolbar-menu.gif
:align: center
.. Position:
Position
========
Bottom position
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
.. seealso::
:attr:`~MDDropdownMenu.position`
.. code-block:: python
from kivy.lang import Builder
from kivy.metrics import dp
from kivy.properties import StringProperty
from kivymd.uix.list import OneLineIconListItem
from kivymd.app import MDApp
from kivymd.uix.menu import MDDropdownMenu
KV = '''
<IconListItem>
IconLeftWidget:
icon: root.icon
MDScreen
MDTextField:
id: field
pos_hint: {'center_x': .5, 'center_y': .6}
size_hint_x: None
width: "200dp"
hint_text: "Password"
on_focus: if self.focus: app.menu.open()
'''
class IconListItem(OneLineIconListItem):
icon = StringProperty()
class Test(MDApp):
def __init__(self, **kwargs):
super().__init__(**kwargs)
self.screen = Builder.load_string(KV)
menu_items = [
{
"viewclass": "IconListItem",
"icon": "git",
"height": dp(56),
"text": f"Item {i}",
"on_release": lambda x=f"Item {i}": self.set_item(x),
} for i in range(5)]
self.menu = MDDropdownMenu(
caller=self.screen.ids.field,
items=menu_items,
position="bottom",
width_mult=4,
)
def set_item(self, text__item):
self.screen.ids.field.text = text__item
self.menu.dismiss()
def build(self):
return self.screen
Test().run()
.. image:: https://github.com/HeaTTheatR/KivyMD-data/raw/master/gallery/kivymddoc/menu-position.gif
:align: center
Center position
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
.. code-block:: python
from kivy.lang import Builder
from kivy.metrics import dp
from kivy.properties import StringProperty
from kivymd.uix.list import OneLineIconListItem
from kivymd.app import MDApp
from kivymd.uix.menu import MDDropdownMenu
KV = '''
<IconListItem>
IconLeftWidget:
icon: root.icon
MDScreen
MDDropDownItem:
id: drop_item
pos_hint: {'center_x': .5, 'center_y': .5}
text: 'Item 0'
on_release: app.menu.open()
'''
class IconListItem(OneLineIconListItem):
icon = StringProperty()
class Test(MDApp):
def __init__(self, **kwargs):
super().__init__(**kwargs)
self.screen = Builder.load_string(KV)
menu_items = [
{
"viewclass": "IconListItem",
"icon": "git",
"text": f"Item {i}",
"height": dp(56),
"on_release": lambda x=f"Item {i}": self.set_item(x),
} for i in range(5)
]
self.menu = MDDropdownMenu(
caller=self.screen.ids.drop_item,
items=menu_items,
position="center",
width_mult=4,
)
self.menu.bind()
def set_item(self, text_item):
self.screen.ids.drop_item.set_item(text_item)
self.menu.dismiss()
def build(self):
return self.screen
Test().run()
.. image:: https://github.com/HeaTTheatR/KivyMD-data/raw/master/gallery/kivymddoc/menu-position-center.gif
:align: center
"""
Te6edf3__all__ Tff7b72= Tb4b4b4(Ta5d6ff"Ta5d6ffMDDropdownMenuTa5d6ff"Tb4b4b4,Tb4b4b4)
Tff7b72import T7ee787os
Tff7b72from T7ee787typing Tff7b72import Te6edf3Union
Tff7b72from T7ee787kivyT7ee787.T7ee787animation Tff7b72import Te6edf3Animation
Tff7b72from T7ee787kivyT7ee787.T7ee787clock Tff7b72import Te6edf3Clock
Tff7b72from T7ee787kivyT7ee787.T7ee787coreT7ee787.T7ee787window Tff7b72import Te6edf3Window
Tff7b72from T7ee787kivyT7ee787.T7ee787coreT7ee787.T7ee787windowT7ee787.T7ee787window_sdl2 Tff7b72import Te6edf3WindowSDL
Tff7b72from T7ee787kivyT7ee787.T7ee787lang Tff7b72import Te6edf3Builder
Tff7b72from T7ee787kivyT7ee787.T7ee787metrics Tff7b72import Te6edf3dp
Tff7b72from T7ee787kivyT7ee787.T7ee787properties Tff7b72import Tb4b4b4(
Te6edf3ColorPropertyTb4b4b4,
Te6edf3ListPropertyTb4b4b4,
Te6edf3NumericPropertyTb4b4b4,
Te6edf3ObjectPropertyTb4b4b4,
Te6edf3OptionPropertyTb4b4b4,
Te6edf3StringPropertyTb4b4b4,
Te6edf3VariableListPropertyTb4b4b4,
Tb4b4b4)
Tff7b72from T7ee787kivyT7ee787.T7ee787uixT7ee787.T7ee787floatlayout Tff7b72import Te6edf3FloatLayout
Tff7b72from T7ee787kivyT7ee787.T7ee787uixT7ee787.T7ee787recycleview Tff7b72import Te6edf3RecycleView
Tff7b72import T7ee787kivymdT7ee787.T7ee787material_resources Tff7b72as T7ee787m_res
Tff7b72from T7ee787kivymd Tff7b72import Te6edf3uix_path
Tff7b72from T7ee787kivymdT7ee787.T7ee787theming Tff7b72import Te6edf3ThemableBehavior
Tff7b72with Tffa657openTb4b4b4(
Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(Te6edf3uix_pathTb4b4b4, Ta5d6ff"Ta5d6ffmenuTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffmenu.kvTa5d6ff"Tb4b4b4)Tb4b4b4, Te6edf3encodingTff7b72=Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"
Tb4b4b4) Tff7b72as Te6edf3kv_fileTb4b4b4:
Te6edf3BuilderTff7b72.Td2a8ffload_stringTb4b4b4(Te6edf3kv_fileTff7b72.Td2a8ffreadTb4b4b4(Tb4b4b4)Tb4b4b4)
Tff7b72class T56d364MDMenuTb4b4b4(Te6edf3RecycleViewTb4b4b4)Tb4b4b4:
Te6edf3width_mult Tff7b72= Te6edf3NumericPropertyTb4b4b4(T79c0ff1Tb4b4b4)
T8b949e"""
See :attr:`~MDDropdownMenu.width_mult`.
"""
Te6edf3drop_cls Tff7b72= Te6edf3ObjectPropertyTb4b4b4(Tb4b4b4)
T8b949e"""
See :class:`~MDDropdownMenu` class.
"""
Tff7b72class T56d364MDDropdownMenuTb4b4b4(Te6edf3ThemableBehaviorTb4b4b4, Te6edf3FloatLayoutTb4b4b4)Tb4b4b4:
T8b949e"""
:Events:
`on_release`
The method that will be called when you click menu items.
"""
Te6edf3header_cls Tff7b72= Te6edf3ObjectPropertyTb4b4b4(Tb4b4b4)
T8b949e"""
An instance of the class (`Kivy` or `KivyMD` widget) that will be added
to the menu header.
.. versionadded:: 0.104.2
See Header_ for more information.
.. image:: https://github.com/HeaTTheatR/KivyMD-data/raw/master/gallery/kivymddoc/menu-header-cls.png
:align: center
:attr:`header_cls` is a :class:`~kivy.properties.ObjectProperty`
and defaults to `None`.
"""
Te6edf3items Tff7b72= Te6edf3ListPropertyTb4b4b4(Tb4b4b4)
T8b949e"""
See :attr:`~kivy.uix.recycleview.RecycleView.data`.
.. code-block:: python
items = [
{
"viewclass": "OneLineListItem",
"height": dp(56),
"text": f"Item {i}",
}
for i in range(5)
]
self.menu = MDDropdownMenu(
items=items,
...,
)
.. image:: https://github.com/HeaTTheatR/KivyMD-data/raw/master/gallery/kivymddoc/menu-items.png
:align: center
:attr:`items` is a :class:`~kivy.properties.ListProperty`
and defaults to `[]`.
"""
Te6edf3width_mult Tff7b72= Te6edf3NumericPropertyTb4b4b4(T79c0ff1Tb4b4b4)
T8b949e"""
This number multiplied by the standard increment ('56dp' on mobile, '64dp'
on desktop), determines the width of the menu items.
If the resulting number were to be too big for the application Window,
the multiplier will be adjusted for the biggest possible one.
.. code-block:: python
self.menu = MDDropdownMenu(
width_mult=4,
...,
)
.. image:: https://github.com/HeaTTheatR/KivyMD-data/raw/master/gallery/kivymddoc/menu-width-mult-4.png
:align: center
.. code-block:: python
self.menu = MDDropdownMenu(
width_mult=8,
...,
)
.. image:: https://github.com/HeaTTheatR/KivyMD-data/raw/master/gallery/kivymddoc/menu-width-mult-8.png
:align: center
:attr:`width_mult` is a :class:`~kivy.properties.NumericProperty`
and defaults to `1`.
"""
Te6edf3max_height Tff7b72= Te6edf3NumericPropertyTb4b4b4(Tb4b4b4)
T8b949e"""
The menu will grow no bigger than this number. Set to 0 for no limit.
.. code-block:: python
self.menu = MDDropdownMenu(
max_height=dp(112),
...,
)
.. image:: https://github.com/HeaTTheatR/KivyMD-data/raw/master/gallery/kivymddoc/menu-max-height-112.png
:align: center
.. code-block:: python
self.menu = MDDropdownMenu(
max_height=dp(224),
...,
)
.. image:: https://github.com/HeaTTheatR/KivyMD-data/raw/master/gallery/kivymddoc/menu-max-height-224.png
:align: center
:attr:`max_height` is a :class:`~kivy.properties.NumericProperty`
and defaults to `0`.
"""
Te6edf3border_margin Tff7b72= Te6edf3NumericPropertyTb4b4b4(Ta5d6ff"Ta5d6ff4dpTa5d6ff"Tb4b4b4)
T8b949e"""
Margin between Window border and menu.
.. code-block:: python
self.menu = MDDropdownMenu(
border_margin=dp(4),
...,
)
.. image:: https://github.com/HeaTTheatR/KivyMD-data/raw/master/gallery/kivymddoc/menu-border-margin-4.png
:align: center
.. code-block:: python
self.menu = MDDropdownMenu(
border_margin=dp(24),
...,
)
.. image:: https://github.com/HeaTTheatR/KivyMD-data/raw/master/gallery/kivymddoc/menu-border-margin-24.png
:align: center
:attr:`border_margin` is a :class:`~kivy.properties.NumericProperty`
and defaults to `4dp`.
"""
Te6edf3ver_growth Tff7b72= Te6edf3OptionPropertyTb4b4b4(Tff7b72NoneTb4b4b4, Te6edf3allownoneTff7b72=Tff7b72TrueTb4b4b4, Te6edf3optionsTff7b72=Tb4b4b4[Ta5d6ff"Ta5d6ffupTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffdownTa5d6ff"Tb4b4b4]Tb4b4b4)
T8b949e"""
Where the menu will grow vertically to when opening. Set to `None` to let
the widget pick for you. Available options are: `'up'`, `'down'`.
.. code-block:: python
self.menu = MDDropdownMenu(
ver_growth="up",
...,
)
.. image:: https://github.com/HeaTTheatR/KivyMD-data/raw/master/gallery/kivymddoc/menu-ver-growth-up.gif
:align: center
.. code-block:: python
self.menu = MDDropdownMenu(
ver_growth="down",
...,
)
.. image:: https://github.com/HeaTTheatR/KivyMD-data/raw/master/gallery/kivymddoc/menu-ver-growth-down.gif
:align: center
:attr:`ver_growth` is a :class:`~kivy.properties.OptionProperty`
and defaults to `None`.
"""
Te6edf3hor_growth Tff7b72= Te6edf3OptionPropertyTb4b4b4(Tff7b72NoneTb4b4b4, Te6edf3allownoneTff7b72=Tff7b72TrueTb4b4b4, Te6edf3optionsTff7b72=Tb4b4b4[Ta5d6ff"Ta5d6ffleftTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffrightTa5d6ff"Tb4b4b4]Tb4b4b4)
T8b949e"""
Where the menu will grow horizontally to when opening. Set to `None` to let
the widget pick for you. Available options are: `'left'`, `'right'`.
.. code-block:: python
self.menu = MDDropdownMenu(
hor_growth="left",
...,
)
.. image:: https://github.com/HeaTTheatR/KivyMD-data/raw/master/gallery/kivymddoc/menu-hor-growth-left.gif
:align: center
.. code-block:: python
self.menu = MDDropdownMenu(
hor_growth="right",
...,
)
.. image:: https://github.com/HeaTTheatR/KivyMD-data/raw/master/gallery/kivymddoc/menu-hor-growth-right.gif
:align: center
:attr:`hor_growth` is a :class:`~kivy.properties.OptionProperty`
and defaults to `None`.
"""
Te6edf3background_color Tff7b72= Te6edf3ColorPropertyTb4b4b4(Tff7b72NoneTb4b4b4)
T8b949e"""
Color of the background of the menu.
.. code-block:: python
self.menu = MDDropdownMenu(
background_color=self.theme_cls.primary_light,
...,
)
.. image:: https://github.com/HeaTTheatR/KivyMD-data/raw/master/gallery/kivymddoc/menu-background-color.png
:align: center
:attr:`background_color` is a :class:`~kivy.properties.ColorProperty`
and defaults to `None`.
"""
Te6edf3opening_transition Tff7b72= Te6edf3StringPropertyTb4b4b4(Ta5d6ff"Ta5d6ffout_cubicTa5d6ff"Tb4b4b4)
T8b949e"""
Type of animation for opening a menu window.
:attr:`opening_transition` is a :class:`~kivy.properties.StringProperty`
and defaults to `'out_cubic'`.
"""
Te6edf3opening_time Tff7b72= Te6edf3NumericPropertyTb4b4b4(T79c0ff0.2Tb4b4b4)
T8b949e"""
Menu window opening animation time and you can set it to 0
if you don't want animation of menu opening.
:attr:`opening_time` is a :class:`~kivy.properties.NumericProperty`
and defaults to `0.2`.
"""
Te6edf3caller Tff7b72= Te6edf3ObjectPropertyTb4b4b4(Tb4b4b4)
T8b949e"""
The widget object that calls the menu window.
:attr:`caller` is a :class:`~kivy.properties.ObjectProperty`
and defaults to `None`.
"""
Te6edf3position Tff7b72= Te6edf3OptionPropertyTb4b4b4(
Ta5d6ff"Ta5d6ffautoTa5d6ff"Tb4b4b4, Te6edf3optionsTff7b72=Tb4b4b4[Ta5d6ff"Ta5d6fftopTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffautoTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffcenterTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffbottomTa5d6ff"Tb4b4b4]
Tb4b4b4)
T8b949e"""
Menu window position relative to parent element.
Available options are: `'auto'`, `'center'`, `'bottom'`.
See Position_ for more information.
.. image:: https://github.com/HeaTTheatR/KivyMD-data/raw/master/gallery/kivymddoc/menu-position.png
:align: center
:attr:`position` is a :class:`~kivy.properties.OptionProperty`
and defaults to `'auto'`.
"""
Te6edf3radius Tff7b72= Te6edf3VariableListPropertyTb4b4b4(Tb4b4b4[Te6edf3dpTb4b4b4(T79c0ff7Tb4b4b4)Tb4b4b4]Tb4b4b4)
T8b949e"""
Menu radius.
.. code-block:: python
self.menu = MDDropdownMenu(
radius=[24, 0, 24, 0],
...,
)
.. image:: https://github.com/HeaTTheatR/KivyMD-data/raw/master/gallery/kivymddoc/menu-radius.png
:align: center
:attr:`radius` is a :class:`~kivy.properties.VariableListProperty`
and defaults to `'[dp(7)]'`.
"""
Te6edf3elevation Tff7b72= Te6edf3NumericPropertyTb4b4b4(T79c0ff10Tb4b4b4)
T8b949e"""
Elevation value of menu dialog.
.. versionadded:: 1.0.0
.. code-block:: python
self.menu = MDDropdownMenu(
elevation=16,
...,
)
.. image:: https://github.com/HeaTTheatR/KivyMD-data/raw/master/gallery/kivymddoc/menu-elevation.png
:align: center
:attr:`elevation` is an :class:`~kivy.properties.NumericProperty`
and defaults to `10`.
"""
Te6edf3_start_coords Tff7b72= Tb4b4b4[Tb4b4b4]
Te6edf3_calculate_complete Tff7b72= Tff7b72False
Te6edf3_calculate_process Tff7b72= Tff7b72False
Tff7b72def Tff7b72__init__Tb4b4b4(Tff7b72selfTb4b4b4, Tff7b72*Tff7b72*Te6edf3kwargsTb4b4b4)Tb4b4b4:
Tffa657superTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ff__init__Tb4b4b4(Tff7b72*Tff7b72*Te6edf3kwargsTb4b4b4)
Te6edf3WindowTff7b72.Td2a8ffbindTb4b4b4(Te6edf3on_resizeTff7b72=Tff7b72selfTff7b72.Td2a8ffcheck_position_callerTb4b4b4)
Te6edf3WindowTff7b72.Td2a8ffbindTb4b4b4(Te6edf3on_maximizeTff7b72=Tff7b72selfTff7b72.Td2a8ffset_menu_propertiesTb4b4b4)
Te6edf3WindowTff7b72.Td2a8ffbindTb4b4b4(Te6edf3on_restoreTff7b72=Tff7b72selfTff7b72.Td2a8ffset_menu_propertiesTb4b4b4)
Te6edf3ClockTff7b72.Td2a8ffschedule_onceTb4b4b4(Tff7b72selfTff7b72.Td2a8ffajust_radiusTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffregister_event_typeTb4b4b4(Ta5d6ff"Ta5d6ffon_dismissTa5d6ff"Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffmenu Tff7b72= Tff7b72selfTff7b72.Td2a8ffidsTff7b72.Td2a8ffmd_menu
Tff7b72selfTff7b72.Td2a8fftarget_height Tff7b72= T79c0ff0
Tff7b72def Td2a8ffcheck_position_callerTb4b4b4(
Tff7b72selfTb4b4b4, Te6edf3instance_windowTb4b4b4: Te6edf3WindowSDLTb4b4b4, Te6edf3widthTb4b4b4: Tffa657intTb4b4b4, Te6edf3heightTb4b4b4: Tffa657int
Tb4b4b4) Tff7b72-Tff7b72> Tff7b72NoneTb4b4b4:
T8b949e"""Called when the application root window is resized."""
T8b949e# FIXME: Menu position is not recalculated when changing the size of
T8b949e# the root application window.
Tff7b72selfTff7b72.Td2a8ffset_menu_propertiesTb4b4b4(T79c0ff0Tb4b4b4)
Tff7b72def Td2a8ffset_menu_propertiesTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3intervalTb4b4b4: Te6edf3UnionTb4b4b4[Tffa657intTb4b4b4, Tffa657floatTb4b4b4] Tff7b72= T79c0ff0Tb4b4b4) Tff7b72-Tff7b72> Tff7b72NoneTb4b4b4:
T8b949e"""Sets the size and position for the menu window."""
Tff7b72if Tff7b72selfTff7b72.Td2a8ffcallerTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffidsTff7b72.Td2a8ffmd_menuTff7b72.Td2a8ffdata Tff7b72= Tff7b72selfTff7b72.Td2a8ffitems
T8b949e# We need to pick a starting point, see how big we need to be,
T8b949e# and where to grow to.
Tff7b72selfTff7b72.Td2a8ff_start_coords Tff7b72= Tff7b72selfTff7b72.Td2a8ffcallerTff7b72.Td2a8ffto_windowTb4b4b4(
Tff7b72selfTff7b72.Td2a8ffcallerTff7b72.Td2a8ffcenter_xTb4b4b4, Tff7b72selfTff7b72.Td2a8ffcallerTff7b72.Td2a8ffcenter_y
Tb4b4b4)
Tff7b72selfTff7b72.Td2a8fftarget_width Tff7b72= Tff7b72selfTff7b72.Td2a8ffwidth_mult Tff7b72* Te6edf3m_resTff7b72.Td2a8ffSTANDARD_INCREMENT
T8b949e# If we're wider than the Window...
Tff7b72if Tff7b72selfTff7b72.Td2a8fftarget_width Tff7b72> Te6edf3WindowTff7b72.Td2a8ffwidthTb4b4b4:
T8b949e# ...reduce our multiplier to max allowed.
Tff7b72selfTff7b72.Td2a8fftarget_width Tff7b72= Tb4b4b4(
Tffa657intTb4b4b4(Te6edf3WindowTff7b72.Td2a8ffwidth Tff7b72/ Te6edf3m_resTff7b72.Td2a8ffSTANDARD_INCREMENTTb4b4b4)
Tff7b72* Te6edf3m_resTff7b72.Td2a8ffSTANDARD_INCREMENT
Tb4b4b4)
T8b949e# Set the target_height of the menu depending on the size of
T8b949e# each MDMenuItem or MDMenuItemIcon.
Tff7b72selfTff7b72.Td2a8fftarget_height Tff7b72= T79c0ff0
Tff7b72for Te6edf3item Tff7b72in Tff7b72selfTff7b72.Td2a8ffidsTff7b72.Td2a8ffmd_menuTff7b72.Td2a8ffdataTb4b4b4:
Tff7b72selfTff7b72.Td2a8fftarget_height Tff7b72+Tff7b72= Te6edf3itemTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffheightTa5d6ff"Tb4b4b4, Te6edf3dpTb4b4b4(T79c0ff72Tb4b4b4)Tb4b4b4)
T8b949e# If we're over max_height...
Tff7b72if T79c0ff0 Tff7b72< Tff7b72selfTff7b72.Td2a8ffmax_height Tff7b72< Tff7b72selfTff7b72.Td2a8fftarget_heightTb4b4b4:
Tff7b72selfTff7b72.Td2a8fftarget_height Tff7b72= Tff7b72selfTff7b72.Td2a8ffmax_height
T8b949e# Establish vertical growth direction.
Tff7b72if Tff7b72selfTff7b72.Td2a8ffver_growth Tff7b72is Tff7b72not Tff7b72NoneTb4b4b4:
Te6edf3ver_growth Tff7b72= Tff7b72selfTff7b72.Td2a8ffver_growth
Tff7b72elseTb4b4b4:
T8b949e# If there's enough space below us:
Tff7b72if Tb4b4b4(
Tff7b72selfTff7b72.Td2a8fftarget_height
Tff7b72<Tff7b72= Tff7b72selfTff7b72.Td2a8ff_start_coordsTb4b4b4[T79c0ff1Tb4b4b4] Tff7b72- Tff7b72selfTff7b72.Td2a8ffborder_margin
Tb4b4b4)Tb4b4b4:
Te6edf3ver_growth Tff7b72= Ta5d6ff"Ta5d6ffdownTa5d6ff"
T8b949e# if there's enough space above us:
Tff7b72elif Tb4b4b4(
Tff7b72selfTff7b72.Td2a8fftarget_height
Tff7b72< Te6edf3WindowTff7b72.Td2a8ffheight Tff7b72- Tff7b72selfTff7b72.Td2a8ff_start_coordsTb4b4b4[T79c0ff1Tb4b4b4] Tff7b72- Tff7b72selfTff7b72.Td2a8ffborder_margin
Tb4b4b4)Tb4b4b4:
Te6edf3ver_growth Tff7b72= Ta5d6ff"Ta5d6ffupTa5d6ff"
T8b949e# Otherwise, let's pick the one with more space and adjust
T8b949e# ourselves.
Tff7b72elseTb4b4b4:
T8b949e# If there"s more space below us:
Tff7b72if Tb4b4b4(
Tff7b72selfTff7b72.Td2a8ff_start_coordsTb4b4b4[T79c0ff1Tb4b4b4]
Tff7b72>Tff7b72= Te6edf3WindowTff7b72.Td2a8ffheight Tff7b72- Tff7b72selfTff7b72.Td2a8ff_start_coordsTb4b4b4[T79c0ff1Tb4b4b4]
Tb4b4b4)Tb4b4b4:
Te6edf3ver_growth Tff7b72= Ta5d6ff"Ta5d6ffdownTa5d6ff"
Tff7b72selfTff7b72.Td2a8fftarget_height Tff7b72= Tb4b4b4(
Tff7b72selfTff7b72.Td2a8ff_start_coordsTb4b4b4[T79c0ff1Tb4b4b4] Tff7b72- Tff7b72selfTff7b72.Td2a8ffborder_margin
Tb4b4b4)
T8b949e# If there's more space above us:
Tff7b72elseTb4b4b4:
Te6edf3ver_growth Tff7b72= Ta5d6ff"Ta5d6ffupTa5d6ff"
Tff7b72selfTff7b72.Td2a8fftarget_height Tff7b72= Tb4b4b4(
Te6edf3WindowTff7b72.Td2a8ffheight
Tff7b72- Tff7b72selfTff7b72.Td2a8ff_start_coordsTb4b4b4[T79c0ff1Tb4b4b4]
Tff7b72- Tff7b72selfTff7b72.Td2a8ffborder_margin
Tb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8ffhor_growth Tff7b72is Tff7b72not Tff7b72NoneTb4b4b4:
Te6edf3hor_growth Tff7b72= Tff7b72selfTff7b72.Td2a8ffhor_growth
Tff7b72elseTb4b4b4:
T8b949e# If there's enough space to the right:
Tff7b72if Tb4b4b4(
Tff7b72selfTff7b72.Td2a8fftarget_width
Tff7b72<Tff7b72= Te6edf3WindowTff7b72.Td2a8ffwidth Tff7b72- Tff7b72selfTff7b72.Td2a8ff_start_coordsTb4b4b4[T79c0ff0Tb4b4b4] Tff7b72- Tff7b72selfTff7b72.Td2a8ffborder_margin
Tb4b4b4)Tb4b4b4:
Te6edf3hor_growth Tff7b72= Ta5d6ff"Ta5d6ffrightTa5d6ff"
T8b949e# if there's enough space to the left:
Tff7b72elif Tb4b4b4(
Tff7b72selfTff7b72.Td2a8fftarget_width
Tff7b72< Tff7b72selfTff7b72.Td2a8ff_start_coordsTb4b4b4[T79c0ff0Tb4b4b4] Tff7b72- Tff7b72selfTff7b72.Td2a8ffborder_margin
Tb4b4b4)Tb4b4b4:
Te6edf3hor_growth Tff7b72= Ta5d6ff"Ta5d6ffleftTa5d6ff"
T8b949e# Otherwise, let's pick the one with more space and adjust
T8b949e# ourselves.
Tff7b72elseTb4b4b4:
T8b949e# if there"s more space to the right:
Tff7b72if Tb4b4b4(
Te6edf3WindowTff7b72.Td2a8ffwidth Tff7b72- Tff7b72selfTff7b72.Td2a8ff_start_coordsTb4b4b4[T79c0ff0Tb4b4b4]
Tff7b72>Tff7b72= Tff7b72selfTff7b72.Td2a8ff_start_coordsTb4b4b4[T79c0ff0Tb4b4b4]
Tb4b4b4)Tb4b4b4:
Te6edf3hor_growth Tff7b72= Ta5d6ff"Ta5d6ffrightTa5d6ff"
Tff7b72selfTff7b72.Td2a8fftarget_width Tff7b72= Tb4b4b4(
Te6edf3WindowTff7b72.Td2a8ffwidth
Tff7b72- Tff7b72selfTff7b72.Td2a8ff_start_coordsTb4b4b4[T79c0ff0Tb4b4b4]
Tff7b72- Tff7b72selfTff7b72.Td2a8ffborder_margin
Tb4b4b4)
T8b949e# if there"s more space to the left:
Tff7b72elseTb4b4b4:
Te6edf3hor_growth Tff7b72= Ta5d6ff"Ta5d6ffleftTa5d6ff"
Tff7b72selfTff7b72.Td2a8fftarget_width Tff7b72= Tb4b4b4(
Tff7b72selfTff7b72.Td2a8ff_start_coordsTb4b4b4[T79c0ff0Tb4b4b4] Tff7b72- Tff7b72selfTff7b72.Td2a8ffborder_margin
Tb4b4b4)
Tff7b72if Te6edf3ver_growth Tff7b72== Ta5d6ff"Ta5d6ffdownTa5d6ff"Tb4b4b4:
Tff7b72selfTff7b72.Td2a8fftar_y Tff7b72= Tff7b72selfTff7b72.Td2a8ff_start_coordsTb4b4b4[T79c0ff1Tb4b4b4] Tff7b72- Tff7b72selfTff7b72.Td2a8fftarget_height
Tff7b72elseTb4b4b4: T8b949e# should always be "up"
Tff7b72selfTff7b72.Td2a8fftar_y Tff7b72= Tff7b72selfTff7b72.Td2a8ff_start_coordsTb4b4b4[T79c0ff1Tb4b4b4]
Tff7b72if Te6edf3hor_growth Tff7b72== Ta5d6ff"Ta5d6ffrightTa5d6ff"Tb4b4b4:
Tff7b72selfTff7b72.Td2a8fftar_x Tff7b72= Tff7b72selfTff7b72.Td2a8ff_start_coordsTb4b4b4[T79c0ff0Tb4b4b4]
Tff7b72elseTb4b4b4: T8b949e# should always be "left"
Tff7b72selfTff7b72.Td2a8fftar_x Tff7b72= Tff7b72selfTff7b72.Td2a8ff_start_coordsTb4b4b4[T79c0ff0Tb4b4b4] Tff7b72- Tff7b72selfTff7b72.Td2a8fftarget_width
Tff7b72selfTff7b72.Td2a8ff_calculate_complete Tff7b72= Tff7b72True
Tff7b72def Td2a8ffajust_radiusTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3intervalTb4b4b4: Te6edf3UnionTb4b4b4[Tffa657intTb4b4b4, Tffa657floatTb4b4b4]Tb4b4b4) Tff7b72-Tff7b72> Tff7b72NoneTb4b4b4:
T8b949e"""
Adjusts the radius of the first and last items in the menu list
according to the radius that is set for the menu.
"""
Tff7b72if Tff7b72selfTff7b72.Td2a8ffitemsTb4b4b4:
Te6edf3radius_for_firt_item Tff7b72= Tff7b72selfTff7b72.Td2a8ffradiusTb4b4b4[Tb4b4b4:T79c0ff2Tb4b4b4]
Te6edf3radius_for_last_item Tff7b72= Tff7b72selfTff7b72.Td2a8ffradiusTb4b4b4[T79c0ff2Tb4b4b4:Tb4b4b4]
Te6edf3firt_data_item Tff7b72= Tff7b72selfTff7b72.Td2a8ffitemsTb4b4b4[T79c0ff0Tb4b4b4]
Te6edf3last_data_item Tff7b72= Tff7b72selfTff7b72.Td2a8ffitemsTb4b4b4[Tff7b72-T79c0ff1Tb4b4b4]
Te6edf3firt_data_itemTb4b4b4[Ta5d6ff"Ta5d6ffradiusTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3radius_for_firt_item Tff7b72+ Tb4b4b4[T79c0ff0Tb4b4b4, T79c0ff0Tb4b4b4]
Te6edf3last_data_itemTb4b4b4[Ta5d6ff"Ta5d6ffradiusTa5d6ff"Tb4b4b4] Tff7b72= Tb4b4b4[T79c0ff0Tb4b4b4, T79c0ff0Tb4b4b4] Tff7b72+ Te6edf3radius_for_last_item
Te6edf3last_data_itemTb4b4b4[Ta5d6ff"Ta5d6ffdividerTa5d6ff"Tb4b4b4] Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffitemsTb4b4b4[T79c0ff0Tb4b4b4] Tff7b72= Te6edf3firt_data_item
Tff7b72selfTff7b72.Td2a8ffitemsTb4b4b4[Tff7b72-T79c0ff1Tb4b4b4] Tff7b72= Te6edf3last_data_item
T8b949e# For all other elements of the list, except for the first and
T8b949e# last, we set the value of the radius to `0`.
Tff7b72for Te6edf3iTb4b4b4, Te6edf3data_item Tff7b72in Tffa657enumerateTb4b4b4(Tff7b72selfTff7b72.Td2a8ffitemsTb4b4b4)Tb4b4b4:
Tff7b72if Ta5d6ff"Ta5d6ffradiusTa5d6ff" Tff7b72not Tff7b72in Te6edf3data_itemTb4b4b4:
Te6edf3data_itemTb4b4b4[Ta5d6ff"Ta5d6ffradiusTa5d6ff"Tb4b4b4] Tff7b72= T79c0ff0
Tff7b72selfTff7b72.Td2a8ffitemsTb4b4b4[Te6edf3iTb4b4b4] Tff7b72= Te6edf3data_item
Tff7b72def Td2a8ffadjust_positionTb4b4b4(Tff7b72selfTb4b4b4) Tff7b72-Tff7b72> Tffa657strTb4b4b4:
T8b949e"""
Returns value 'auto' for the menu position if the menu position is out
of screen.
"""
Te6edf3target_width Tff7b72= Tff7b72selfTff7b72.Td2a8fftarget_width
Te6edf3target_height Tff7b72= Tff7b72selfTff7b72.Td2a8fftarget_height
Te6edf3caller Tff7b72= Tff7b72selfTff7b72.Td2a8ffcaller
Te6edf3position Tff7b72= Tff7b72selfTff7b72.Td2a8ffposition
Tff7b72if Tb4b4b4(
Te6edf3callerTff7b72.Td2a8ffx Tff7b72< Te6edf3target_width
Tff7b72or Te6edf3callerTff7b72.Td2a8ffx Tff7b72+ Te6edf3target_width Tff7b72> Te6edf3WindowTff7b72.Td2a8ffwidth
Tff7b72or Te6edf3callerTff7b72.Td2a8ffy Tff7b72+ Te6edf3target_height Tff7b72> Te6edf3WindowTff7b72.Td2a8ffheight
Tff7b72or Tb4b4b4(Te6edf3callerTff7b72.Td2a8ffy Tff7b72< Te6edf3target_height Tff7b72and Te6edf3position Tff7b72== Ta5d6ff"Ta5d6ffcenterTa5d6ff"Tb4b4b4)
Tb4b4b4)Tb4b4b4:
Te6edf3position Tff7b72= Ta5d6ff"Ta5d6ffautoTa5d6ff"
Tff7b72if Tff7b72selfTff7b72.Td2a8ffhor_growth Tff7b72or Tff7b72selfTff7b72.Td2a8ffver_growthTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffhor_growth Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffver_growth Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffset_menu_propertiesTb4b4b4(Tb4b4b4)
Tff7b72return Te6edf3position
Tff7b72def Td2a8ffopenTb4b4b4(Tff7b72selfTb4b4b4) Tff7b72-Tff7b72> Tff7b72NoneTb4b4b4:
T8b949e"""Animate the opening of a menu window."""
Tff7b72def Td2a8ffopenTb4b4b4(Te6edf3intervalTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ff_calculate_completeTb4b4b4:
Tff7b72return
Te6edf3position Tff7b72= Tff7b72selfTff7b72.Td2a8ffadjust_positionTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3position Tff7b72== Ta5d6ff"Ta5d6ffautoTa5d6ff"Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffmenuTff7b72.Td2a8ffpos Tff7b72= Tff7b72selfTff7b72.Td2a8ff_start_coords
Te6edf3anim Tff7b72= Te6edf3AnimationTb4b4b4(
Te6edf3xTff7b72=Tff7b72selfTff7b72.Td2a8fftar_xTb4b4b4,
Te6edf3yTff7b72=Tff7b72selfTff7b72.Td2a8fftar_y
Tff7b72- Tb4b4b4(Tff7b72selfTff7b72.Td2a8ffheader_clsTff7b72.Td2a8ffheight Tff7b72if Tff7b72selfTff7b72.Td2a8ffheader_cls Tff7b72else T79c0ff0Tb4b4b4)Tb4b4b4,
Te6edf3widthTff7b72=Tff7b72selfTff7b72.Td2a8fftarget_widthTb4b4b4,
Te6edf3heightTff7b72=Tff7b72selfTff7b72.Td2a8fftarget_heightTb4b4b4,
Te6edf3durationTff7b72=Tff7b72selfTff7b72.Td2a8ffopening_timeTb4b4b4,
Te6edf3opacityTff7b72=T79c0ff1Tb4b4b4,
Te6edf3transitionTff7b72=Tff7b72selfTff7b72.Td2a8ffopening_transitionTb4b4b4,
Tb4b4b4)
Te6edf3animTff7b72.Td2a8ffstartTb4b4b4(Tff7b72selfTff7b72.Td2a8ffmenuTb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72if Te6edf3position Tff7b72== Ta5d6ff"Ta5d6ffcenterTa5d6ff"Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffmenuTff7b72.Td2a8ffpos Tff7b72= Tb4b4b4(
Tff7b72selfTff7b72.Td2a8ff_start_coordsTb4b4b4[T79c0ff0Tb4b4b4] Tff7b72- Tff7b72selfTff7b72.Td2a8fftarget_width Tff7b72/ T79c0ff2Tb4b4b4,
Tff7b72selfTff7b72.Td2a8ff_start_coordsTb4b4b4[T79c0ff1Tb4b4b4] Tff7b72- Tff7b72selfTff7b72.Td2a8fftarget_height Tff7b72/ T79c0ff2Tb4b4b4,
Tb4b4b4)
Tff7b72elif Te6edf3position Tff7b72== Ta5d6ff"Ta5d6ffbottomTa5d6ff"Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffmenuTff7b72.Td2a8ffpos Tff7b72= Tb4b4b4(
Tff7b72selfTff7b72.Td2a8ff_start_coordsTb4b4b4[T79c0ff0Tb4b4b4] Tff7b72- Tff7b72selfTff7b72.Td2a8fftarget_width Tff7b72/ T79c0ff2Tb4b4b4,
Tff7b72selfTff7b72.Td2a8ffcallerTff7b72.Td2a8ffposTb4b4b4[T79c0ff1Tb4b4b4] Tff7b72- Tff7b72selfTff7b72.Td2a8fftarget_heightTb4b4b4,
Tb4b4b4)
Tff7b72elif Te6edf3position Tff7b72== Ta5d6ff"Ta5d6fftopTa5d6ff"Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffmenuTff7b72.Td2a8ffpos Tff7b72= Tb4b4b4(
Tff7b72selfTff7b72.Td2a8ff_start_coordsTb4b4b4[T79c0ff0Tb4b4b4] Tff7b72- Tff7b72selfTff7b72.Td2a8fftarget_width Tff7b72/ T79c0ff2Tb4b4b4,
Tff7b72selfTff7b72.Td2a8ffcallerTff7b72.Td2a8ffposTb4b4b4[T79c0ff1Tb4b4b4] Tff7b72+ Tff7b72selfTff7b72.Td2a8ffcallerTff7b72.Td2a8ffheightTb4b4b4,
Tb4b4b4)
Te6edf3anim Tff7b72= Te6edf3AnimationTb4b4b4(
Te6edf3widthTff7b72=Tff7b72selfTff7b72.Td2a8fftarget_widthTb4b4b4,
Te6edf3heightTff7b72=Tff7b72selfTff7b72.Td2a8fftarget_heightTb4b4b4,
Te6edf3durationTff7b72=Tff7b72selfTff7b72.Td2a8ffopening_timeTb4b4b4,
Te6edf3opacityTff7b72=T79c0ff1Tb4b4b4,
Te6edf3transitionTff7b72=Tff7b72selfTff7b72.Td2a8ffopening_transitionTb4b4b4,
Tb4b4b4)
Te6edf3animTff7b72.Td2a8ffstartTb4b4b4(Tff7b72selfTff7b72.Td2a8ffmenuTb4b4b4)
Te6edf3WindowTff7b72.Td2a8ffadd_widgetTb4b4b4(Tff7b72selfTb4b4b4)
Te6edf3ClockTff7b72.Td2a8ffunscheduleTb4b4b4(Tffa657openTb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_calculate_process Tff7b72= Tff7b72False
Tff7b72selfTff7b72.Td2a8ffset_menu_propertiesTb4b4b4(Tb4b4b4)
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ff_calculate_processTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_calculate_process Tff7b72= Tff7b72True
Te6edf3ClockTff7b72.Td2a8ffschedule_intervalTb4b4b4(Tffa657openTb4b4b4, T79c0ff0Tb4b4b4)
Tff7b72def Td2a8ffon_header_clsTb4b4b4(
Tff7b72selfTb4b4b4, Te6edf3instance_dropdown_menuTb4b4b4, Te6edf3instance_user_menu_header
Tb4b4b4) Tff7b72-Tff7b72> Tff7b72NoneTb4b4b4:
T8b949e"""Called when a value is set to the :attr:`header_cls` parameter."""
Tff7b72def Td2a8ffadd_content_header_clsTb4b4b4(Te6edf3intervalTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffidsTff7b72.Td2a8ffcontent_headerTff7b72.Td2a8ffclear_widgetsTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffidsTff7b72.Td2a8ffcontent_headerTff7b72.Td2a8ffadd_widgetTb4b4b4(Te6edf3instance_user_menu_headerTb4b4b4)
Te6edf3ClockTff7b72.Td2a8ffschedule_onceTb4b4b4(Te6edf3add_content_header_clsTb4b4b4, T79c0ff1Tb4b4b4)
Tff7b72def Td2a8ffon_touch_downTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3touchTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ffmenuTff7b72.Td2a8ffcollide_pointTb4b4b4(Tff7b72*Te6edf3touchTff7b72.Td2a8ffposTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffdispatchTb4b4b4(Ta5d6ff"Ta5d6ffon_dismissTa5d6ff"Tb4b4b4)
Tff7b72return Tff7b72True
Tffa657superTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ffon_touch_downTb4b4b4(Te6edf3touchTb4b4b4)
Tff7b72return Tff7b72True
Tff7b72def Td2a8ffon_touch_moveTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3touchTb4b4b4)Tb4b4b4:
Tffa657superTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ffon_touch_moveTb4b4b4(Te6edf3touchTb4b4b4)
Tff7b72return Tff7b72True
Tff7b72def Td2a8ffon_touch_upTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3touchTb4b4b4)Tb4b4b4:
Tffa657superTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ffon_touch_upTb4b4b4(Te6edf3touchTb4b4b4)
Tff7b72return Tff7b72True
Tff7b72def Td2a8ffon_dismissTb4b4b4(Tff7b72selfTb4b4b4) Tff7b72-Tff7b72> Tff7b72NoneTb4b4b4:
T8b949e"""Called when the menu is closed."""
Te6edf3WindowTff7b72.Td2a8ffremove_widgetTb4b4b4(Tff7b72selfTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffmenuTff7b72.Td2a8ffwidth Tff7b72= T79c0ff0
Tff7b72selfTff7b72.Td2a8ffmenuTff7b72.Td2a8ffheight Tff7b72= T79c0ff0
Tff7b72selfTff7b72.Td2a8ffmenuTff7b72.Td2a8ffopacity Tff7b72= T79c0ff0
Tff7b72def Td2a8ffdismissTb4b4b4(Tff7b72selfTb4b4b4, Tff7b72*Te6edf3argsTb4b4b4) Tff7b72-Tff7b72> Tff7b72NoneTb4b4b4:
T8b949e"""Closes the menu."""
Tff7b72selfTff7b72.Td2a8ffon_dismissTb4b4b4(Tb4b4b4)
Tff7b72if Tff7b72__name__ Tff7b72== Ta5d6ff"Ta5d6ff__main__Ta5d6ff"Tb4b4b4:
T8b949e# To test the correct menu position.
Tff7b72from T7ee787kivyT7ee787.T7ee787lang Tff7b72import Te6edf3Builder
Tff7b72from T7ee787kivyT7ee787.T7ee787metrics Tff7b72import Te6edf3dp
Tff7b72from T7ee787kivymdT7ee787.T7ee787app Tff7b72import Te6edf3MDApp
Tff7b72from T7ee787kivymdT7ee787.T7ee787uixT7ee787.T7ee787button Tff7b72import Te6edf3MDRaisedButton
Tff7b72from T7ee787kivymdT7ee787.T7ee787uixT7ee787.T7ee787screen Tff7b72import Te6edf3MDScreen
Tff7b72class T56d364TestTb4b4b4(Te6edf3MDAppTb4b4b4)Tb4b4b4:
Tff7b72def Tff7b72__init__Tb4b4b4(Tff7b72selfTb4b4b4, Tff7b72*Tff7b72*Te6edf3kwargsTb4b4b4)Tb4b4b4:
Tffa657superTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ff__init__Tb4b4b4(Tff7b72*Tff7b72*Te6edf3kwargsTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffscreen Tff7b72= Te6edf3MDScreenTb4b4b4(Tb4b4b4)
Te6edf3menu_items Tff7b72= Tb4b4b4[
Tb4b4b4{
Ta5d6ff"Ta5d6ffviewclassTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffOneLineListItemTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffheightTa5d6ff"Tb4b4b4: Te6edf3dpTb4b4b4(T79c0ff56Tb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6fftextTa5d6ff"Tb4b4b4: Ta5d6fffTa5d6ff"Ta5d6ffItem Tffd700{Te6edf3iTffd700}Ta5d6ff"Tb4b4b4,
Tb4b4b4}
Tff7b72for Te6edf3i Tff7b72in Tffa657rangeTb4b4b4(T79c0ff5Tb4b4b4)
Tb4b4b4]
Tff7b72selfTff7b72.Td2a8ffmenu Tff7b72= Te6edf3MDDropdownMenuTb4b4b4(Te6edf3itemsTff7b72=Te6edf3menu_itemsTb4b4b4, Te6edf3width_multTff7b72=T79c0ff4Tb4b4b4)
Tff7b72def Td2a8ffopen_menuTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3callerTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffmenuTff7b72.Td2a8ffcaller Tff7b72= Te6edf3caller
Tff7b72selfTff7b72.Td2a8ffmenuTff7b72.Td2a8ffopenTb4b4b4(Tb4b4b4)
Tff7b72def Td2a8ffon_startTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Te6edf3pos_hints Tff7b72= Tb4b4b4[
Tb4b4b4{Ta5d6ff"Ta5d6fftopTa5d6ff"Tb4b4b4: T79c0ff1Tb4b4b4, Ta5d6ff"Ta5d6ffleftTa5d6ff"Tb4b4b4: T79c0ff0.1Tb4b4b4}Tb4b4b4,
Tb4b4b4{Ta5d6ff"Ta5d6fftopTa5d6ff"Tb4b4b4: T79c0ff1Tb4b4b4, Ta5d6ff"Ta5d6ffcenter_xTa5d6ff"Tb4b4b4: T79c0ff0.5Tb4b4b4}Tb4b4b4,
Tb4b4b4{Ta5d6ff"Ta5d6fftopTa5d6ff"Tb4b4b4: T79c0ff1Tb4b4b4, Ta5d6ff"Ta5d6ffrightTa5d6ff"Tb4b4b4: T79c0ff1Tb4b4b4}Tb4b4b4,
Tb4b4b4{Ta5d6ff"Ta5d6ffcenter_yTa5d6ff"Tb4b4b4: T79c0ff0.5Tb4b4b4, Ta5d6ff"Ta5d6ffleftTa5d6ff"Tb4b4b4: T79c0ff1Tb4b4b4}Tb4b4b4,
Tb4b4b4{Ta5d6ff"Ta5d6ffbottomTa5d6ff"Tb4b4b4: T79c0ff1Tb4b4b4, Ta5d6ff"Ta5d6ffleftTa5d6ff"Tb4b4b4: T79c0ff1Tb4b4b4}Tb4b4b4,
Tb4b4b4{Ta5d6ff"Ta5d6ffbottomTa5d6ff"Tb4b4b4: T79c0ff1Tb4b4b4, Ta5d6ff"Ta5d6ffcenter_xTa5d6ff"Tb4b4b4: T79c0ff0.5Tb4b4b4}Tb4b4b4,
Tb4b4b4{Ta5d6ff"Ta5d6ffbottomTa5d6ff"Tb4b4b4: T79c0ff1Tb4b4b4, Ta5d6ff"Ta5d6ffrightTa5d6ff"Tb4b4b4: T79c0ff1Tb4b4b4}Tb4b4b4,
Tb4b4b4{Ta5d6ff"Ta5d6ffcenter_yTa5d6ff"Tb4b4b4: T79c0ff0.5Tb4b4b4, Ta5d6ff"Ta5d6ffrightTa5d6ff"Tb4b4b4: T79c0ff1Tb4b4b4}Tb4b4b4,
Tb4b4b4{Ta5d6ff"Ta5d6ffcenter_yTa5d6ff"Tb4b4b4: T79c0ff0.5Tb4b4b4, Ta5d6ff"Ta5d6ffcenter_xTa5d6ff"Tb4b4b4: T79c0ff0.5Tb4b4b4}Tb4b4b4,
Tb4b4b4]
Tff7b72for Te6edf3pos_hint Tff7b72in Te6edf3pos_hintsTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffscreenTff7b72.Td2a8ffadd_widgetTb4b4b4(
Te6edf3MDRaisedButtonTb4b4b4(Te6edf3pos_hintTff7b72=Te6edf3pos_hintTb4b4b4, Te6edf3on_releaseTff7b72=Tff7b72selfTff7b72.Td2a8ffopen_menuTb4b4b4)
Tb4b4b4)
Tff7b72def Td2a8ffbuildTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72selfTff7b72.Td2a8ffscreen
Te6edf3TestTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ffrunTb4b4b4(Tb4b4b4)
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────